#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<string.h>
#include<stdlib.h>

//程序替换：替换代码和数据。并不会影响进行程序替换的这个进程所打开的文件
int main()
{
    int fd = open("log.txt" , O_WRONLY | O_TRUNC | O_CREAT , 0666);
    if(fd < 0)
    {
        perror("open");
        exit(1);
    }

    dup2(fd , 1);
    execl("/usr/bin/ls" , "ls" , "-al" , NULL);

    return 0;
}

//int main()
//{
//    //创建子进程，子进程会继承父进程的pcb、地址空间、页表，当然也会继承文件描述符表
//    //但是子进程关闭这个文件并不会影响父进程，因为在struct file 中存在这个文件的引用计数
//    pid_t id = fork();
//    if(id == 0)
//    {
//        sleep(1);
//        close(1);//输出
//        exit(0);
//    }
//    //父进程向stdout 中打印数据
//    printf("hello world\n");
//
//    return 0;
//}
//int main()
//{
//    //使用dup2 进行重定向，old -> new 将old 中的指针拷贝放入new 中， 即 让第二个参数与第一个参数指向的文件相同
//    int fd = open("log.txt" , O_WRONLY | O_CREAT | O_APPEND , 0666);
//    if(fd < 0)
//    {
//        perror("open");
//        exit(1);
//    }
//    
//    dup2(fd , 1);// 输出重定向
//    printf("hello world!\n" );
    

    //close(1);
    //int fd = open("log.txt" , O_CREAT | O_WRONLY | O_TRUNC , 0666);
    //if(fd < 0)
    //{
    //    perror("open");
    //    exit(1);
    //}

    //printf("hello world , %d\n" , fd);
    //
    //fflush(stdout);
    //close(fd);

//    return 0;
//}
